export {};

type Obj = {
  name: string;
};

// 1 将一个约束属性，变为可选。
type Props = {
  id: string;
  children: number[];
  // obj: object; // 是一个对象就行
  obj2: Obj; // 外边定一个具体的约束，类型
};

type ReadOnlyProps2 = Readonly<Props>;
let obj5: ReadOnlyProps2 = {
  id: '',
  children: [],
  obj2: {
    name: 'xxx',
  },
};
// obj5.obj2 = {} // 赋新值的不行
obj5.obj2.name = 'yyy'; // 改变内容可以，和数组同理

// type Props2 = {
//   id?: string,
//   children?: number[]
// }

// 泛型工具：Partial
type Props3 = Partial<Props>;

let obj: Props3 = { id: 'xx' };

// let obj2: Props = {id: 'xx'}

// 泛型工具：Readonly， 生成对象属性，只读约束规则
// 参数：是其它规则，约束，类型
// 返回值：新的类型，属性只读
type ReadOnlyProps = Readonly<Props>;

// obj3的属性是只读
let obj3: ReadOnlyProps = {
  id: '123',
  children: [1, 2, 3],
  obj2: {
    name: '',
  },
};
console.log(obj3.id);
// obj3.id = '123' // 不能改变，不能赋值
// 引用类型特殊：
// 不能赋新值（新的对象，或者数组），但是通过引用，改内容。对象同理。
obj3.children.push(4);
console.log(obj3.children);

// 泛型工具，挑规则，挑属性
interface Props2 {
  id: string;
  title: string;
  children: number[];
}
type PickProps = Pick<Props2, 'id'>;

let obj4: PickProps = {
  id: '123',
  // title: '123',
};
